package com.googlecode.floreo.ecf.bematech;

import bemajava.BemaInteger;
import bemajava.BemaString;
import bemajava.Bematech;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

public class BematechMP2100 {

  private static int retorno;
  private static Boolean executadoComSucesso;
  
  public static void verificaRetornoImpressoraFiscal() {
    if (retorno == -28) {
      executadoComSucesso = false;
      JOptionPane.showMessageDialog(null, "Não há informações para serem impressas", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
    } else if (retorno == -26) {  
      executadoComSucesso = false;
      JOptionPane.showMessageDialog(null, "Transação já Efetuada", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);      
    } else if (retorno == -25) {
      executadoComSucesso = false;
      JOptionPane.showMessageDialog(null, "Totalizador não Fiscal não Programado", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
    } else if (retorno == -24) {
      executadoComSucesso = false;
      JOptionPane.showMessageDialog(null, "Forma de pagamento não programada", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
    } else if (retorno == -23) {
      executadoComSucesso = false;
      JOptionPane.showMessageDialog(null, "Não foi possível terminar a operação", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
    } else if (retorno == -22) {
      executadoComSucesso = false;
      JOptionPane.showMessageDialog(null, "Não foi possível terminar a impressão", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
    } else if (retorno == -21) {
      executadoComSucesso = false;
      JOptionPane.showMessageDialog(null, "A Transação não foi Aprovada", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
    } else if (retorno == -20) {
      executadoComSucesso = false;
      JOptionPane.showMessageDialog(null, "Transação Cancelada pelo Operador", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
    } else if (retorno == -19) {
      executadoComSucesso = false;
      JOptionPane.showMessageDialog(null, "Parâmetros Diferentes", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
    } else if (retorno == -18) {
      executadoComSucesso = false;
      JOptionPane.showMessageDialog(null, "Não foi possível abrir o arquivo Intpos.001", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
    } else if (retorno == -8) {
      executadoComSucesso = false;
      JOptionPane.showMessageDialog(null, "Erro ao criar ou gravar no arquivo Retorno.txt", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
    } else if (retorno == -7) {
      executadoComSucesso = false;
      JOptionPane.showMessageDialog(null, "Banco não cadastrado no arquivo BemaFI32.ini", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
    } else if (retorno == -6) {
      executadoComSucesso = false;
      JOptionPane.showMessageDialog(null, "Impressora desligada ou desconectada", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
    } else if (retorno == -5) {
      executadoComSucesso = false;
      JOptionPane.showMessageDialog(null, "Erro ao abrir a porta de comunicação", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
    } else if (retorno == -4) {
      executadoComSucesso = false;
      JOptionPane.showMessageDialog(null, "Arquivo BemaFI32.ini não encontrado", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
    } else if (retorno == -3) {
      executadoComSucesso = false;
      JOptionPane.showMessageDialog(null, "Alíquota não Programada", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
    } else if (retorno == -2) {
      executadoComSucesso = false;
      JOptionPane.showMessageDialog(null, "Parâmetro Inválido", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
    } else if (retorno == -1) {
      executadoComSucesso = false;
      JOptionPane.showMessageDialog(null, "Erro de Execução na Função", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
    } else if (retorno == 0) {
      executadoComSucesso = false;
      JOptionPane.showMessageDialog(null, "Erro de Comunicação", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
    } else {
      executadoComSucesso = true;
    }
  }

  public static void retornoImpressoraFiscal() {

    BemaInteger ack = new BemaInteger();
    BemaInteger st1 = new BemaInteger();
    BemaInteger st2 = new BemaInteger();

    retorno = Bematech.RetornoImpressora(ack, st1, st2);

    if (ack.number == 6) {

      // st1
      if (st1.number >= 128) {
        executadoComSucesso = false;
        st1.number = st1.number - 128;
        JOptionPane.showMessageDialog(null, "Fim do Papel", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
      }

      if (st1.number >= 64) {
        executadoComSucesso = false;
        st1.number = st1.number - 64;
        JOptionPane.showMessageDialog(null, "Pouco Papel", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
      }

      if (st1.number >= 32) {
        executadoComSucesso = false;
        st1.number = st1.number - 32;
        JOptionPane.showMessageDialog(null, "Erro no relógio", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
      }

      if (st1.number >= 16) {
        executadoComSucesso = false;
        st1.number = st1.number - 16;
        JOptionPane.showMessageDialog(null, "Impressora em Erro", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
      }

      if (st1.number >= 8) {
        executadoComSucesso = false;
        st1.number = st1.number - 8;
        JOptionPane.showMessageDialog(null, "Comando não inciado com ESC", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
      }

      if (st1.number >= 4) {
        executadoComSucesso = false;
        st1.number = st1.number - 4;
        JOptionPane.showMessageDialog(null, "Comando Inexistente", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
      }

      if (st1.number >= 2) {
        executadoComSucesso = false;
        st1.number = st1.number - 2;
        JOptionPane.showMessageDialog(null, "Cupom Aberto", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
      }

      if (st1.number >= 1) {
        executadoComSucesso = false;
        st1.number = st1.number - 1;
        JOptionPane.showMessageDialog(null, "Número de Parâmetro(s) Inválido(s", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
      }

      // st2
      if (st2.number >= 128) {
        executadoComSucesso = false;
        st2.number = st2.number - 128;
        JOptionPane.showMessageDialog(null, "Tipo de Parâmetro de Comando Inválido", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
      }

      if (st2.number >= 64) {
        executadoComSucesso = false;
        st2.number = st2.number - 64;
        JOptionPane.showMessageDialog(null, "Memória Fiscal Lotada", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
      }

      if (st2.number >= 32) {
        executadoComSucesso = false;
        st2.number = st2.number - 32;
        JOptionPane.showMessageDialog(null, "Erro na Memória RAM", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
      }

      if (st2.number >= 16) {
        executadoComSucesso = false;
        st2.number = st2.number - 16;
        JOptionPane.showMessageDialog(null, "Alíquota não Programada", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
      }

      if (st2.number >= 8) {
        executadoComSucesso = false;
        st2.number = st2.number - 8;
        JOptionPane.showMessageDialog(null, "Capacidade de Alíquotas Lotadas", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
      }

      if (st2.number >= 4) {
        executadoComSucesso = false;
        st2.number = st2.number - 4;
        JOptionPane.showMessageDialog(null, "Cancelamento não Permitido", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
      }

      if (st2.number >= 2) {
        executadoComSucesso = false;
        st2.number = st2.number - 2;
        JOptionPane.showMessageDialog(null, "CNPJ/IE do Proprietário não Programado", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
      }

      if (st2.number >= 1) {
        executadoComSucesso = false;
        st2.number = st2.number - 1;
        JOptionPane.showMessageDialog(null, "Comando não Executado", com.floreantpos.POSConstants.MDS_POS, JOptionPane.ERROR_MESSAGE, null);
      } else {
        executadoComSucesso = true;
      }
    } else {
      executadoComSucesso = false;
    }
  }

  public static void leituraX() {
    if (JOptionPane.showConfirmDialog(null, "Confirma a emissão da Leitura X?", com.floreantpos.POSConstants.MDS_POS, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
      retorno = Bematech.LeituraX();
      verificaRetornoImpressoraFiscal();
      retornoImpressoraFiscal();
    }
  }

  public static void reducaoZ() {
    if (JOptionPane.showConfirmDialog(null, "Confirma a emissão da Redução Z?", com.floreantpos.POSConstants.MDS_POS, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
      retorno = Bematech.ReducaoZ("", "");
      verificaRetornoImpressoraFiscal();
      retornoImpressoraFiscal();
    }
  }

  public static Boolean abreCupom(String cpfCnpjCliente) {
    retorno = Bematech.AbreCupom(cpfCnpjCliente);
    verificaRetornoImpressoraFiscal();
    retornoImpressoraFiscal();
    
    return executadoComSucesso;    
  }

  public static Boolean fechaCupom(String formaPgto, String acresDesc, String tipoAcresDesc, String valorAcresDesc, String valorPago, String msgPromocional) {
    retorno = Bematech.FechaCupom(formaPgto, acresDesc, tipoAcresDesc, valorAcresDesc, valorPago, msgPromocional);
    verificaRetornoImpressoraFiscal();
    retornoImpressoraFiscal();
      
    return executadoComSucesso;
  }
  
  public static Boolean fechaCupomResumido(String formaPgto, String msgPromocional) {
    retorno = Bematech.FechaCupomResumido(formaPgto, msgPromocional);
    verificaRetornoImpressoraFiscal();
    retornoImpressoraFiscal();
      
    return executadoComSucesso;    
  }  

  public static void programaHorarioVerao() {
    if (JOptionPane.showConfirmDialog(null, "Confirma a alteração do horário de verão?", com.floreantpos.POSConstants.MDS_POS, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
      retorno = Bematech.ProgramaHorarioVerao();
      verificaRetornoImpressoraFiscal();
      retornoImpressoraFiscal();
    }
  }

  public static void abrePortaSerial() {
    retorno = Bematech.AbrePortaSerial();
    verificaRetornoImpressoraFiscal();
    retornoImpressoraFiscal();
  }

  public static void fechaPortaSerial() {
    retorno = Bematech.FechaPortaSerial();
    verificaRetornoImpressoraFiscal();
    retornoImpressoraFiscal();
  }

  public static void leituraMemoriaFiscalPorData(String dataInicial, String dataFinal) {
    retorno = Bematech.LeituraMemoriaFiscalData(dataFinal, dataFinal);
    verificaRetornoImpressoraFiscal();
    retornoImpressoraFiscal();
  }

  public static void leituraMemoriaFiscalPorReducao(String reducaoInicial, String reducaoFinal) {
    retorno = Bematech.LeituraMemoriaFiscalReducao(reducaoInicial, reducaoFinal);
    verificaRetornoImpressoraFiscal();
    retornoImpressoraFiscal();
  }

  public static Boolean cancelaCupom() {
    if (JOptionPane.showConfirmDialog(null, "Confirma o cancelamento do último cupom emitido?", com.floreantpos.POSConstants.MDS_POS, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
      retorno = Bematech.CancelaCupom();
      verificaRetornoImpressoraFiscal();
      retornoImpressoraFiscal();
    }   
    return executadoComSucesso;
  }

  public static Boolean vendeItem(String codigo, String descricao, String aliquota, String tipoQtd, String qtd, Integer casasDecimais, String valor, String tipoDesconto, String valorDesconto) {
    retorno = Bematech.VendeItem(codigo, descricao, aliquota, tipoQtd, qtd, casasDecimais, valor, tipoDesconto, valorDesconto);
    verificaRetornoImpressoraFiscal();
    retornoImpressoraFiscal();
    
    return executadoComSucesso;    
  }

  public static void cancelaItemAnterior() {
    retorno = Bematech.CancelaItemAnterior();
    verificaRetornoImpressoraFiscal();
    retornoImpressoraFiscal();
  }

  public static void cancelaItemGenerico(String item) {
    retorno = Bematech.CancelaItemGenerico(item);
    verificaRetornoImpressoraFiscal();
    retornoImpressoraFiscal();
  }
  
  public static void programaAliquota(String aliquota, Integer categoria) {
    retorno = Bematech.ProgramaAliquota(aliquota, categoria);
    verificaRetornoImpressoraFiscal();
    retornoImpressoraFiscal(); 
  }
  
  public static String retornoAliquotas() {
    BemaString aliquotas = new BemaString();
    retorno = Bematech.RetornoAliquotas(aliquotas);
    verificaRetornoImpressoraFiscal();
    retornoImpressoraFiscal();
    
    return aliquotas.getBuffer();
  } 
  
  public static String numeroCupom() {
    BemaString cupom = new BemaString();
    retorno = Bematech.NumeroCupom(cupom);
    verificaRetornoImpressoraFiscal();
    retornoImpressoraFiscal();
    
    return cupom.getBuffer();
  }  
  
  public static String geraRegistrosCAT52MFDEx(String arquivo, String data) {
    BemaString arqDestino = new BemaString();
    retorno = Bematech.GeraRegistrosCAT52MFDEx(arquivo, data, arqDestino);
    verificaRetornoImpressoraFiscal();
    retornoImpressoraFiscal();
    
    return arqDestino.getBuffer();
  }   
  
  public static String verificaIndiceAliquotasISS() {
    BemaString aliquotas = new BemaString();
    retorno = Bematech.VerificaIndiceAliquotasIss(aliquotas);
    verificaRetornoImpressoraFiscal();
    retornoImpressoraFiscal();
    
    return aliquotas.getBuffer();
  }
  
  public static String verificaAliquotasISS() {
    BemaString aliquotas = new BemaString();
    retorno = Bematech.VerificaAliquotasISS(aliquotas);
    verificaRetornoImpressoraFiscal();
    retornoImpressoraFiscal();
    
    return aliquotas.getBuffer();
  } 
  
  public static String verificaFormasPagamento() {
    BemaString formasPagamento = new BemaString();
    retorno = Bematech.VerificaFormasPagamento(formasPagamento);
    verificaRetornoImpressoraFiscal();
    retornoImpressoraFiscal();
    
    return formasPagamento.getBuffer();
  } 
  
  public static void programaFormaPagamentoMFD(String FormaPagto, String OperacaoTef) {
    retorno = Bematech.ProgramaFormaPagamentoMFD(FormaPagto, OperacaoTef);
    verificaRetornoImpressoraFiscal();
    retornoImpressoraFiscal();
  }  
  
  public static Boolean impressoraFiscalLigada() {
    retorno = Bematech.VerificaImpressoraLigada();
    verificaRetornoImpressoraFiscal();
    retornoImpressoraFiscal(); 
      
    return executadoComSucesso;
  } 
  
  public static List retornoAliquotasT() {
    String indicesAliquotasISS = verificaIndiceAliquotasISS().replace(",", "");
    String aliquotas = retornoAliquotas().replace(",", "");
    
    List<String> aliquotasList = new ArrayList<String>();
    
    for (int i = 0 ; i < aliquotas.length() ; i += 4) {
      aliquotasList.add(aliquotas.substring(i, i + 4));
    }
    
    int j = 1;
    
    for (int i = 0 ; i < indicesAliquotasISS.length() ; i += 2) {
      int indiceAliquotaISS = Integer.valueOf(indicesAliquotasISS.substring(i, i + 2));
      aliquotasList.remove(indiceAliquotaISS - j);
      j++;
    }

    return aliquotasList;
  }   
  
  public static List retornoAliquotasS() {
    String aliquotas = verificaAliquotasISS().replace(",", "");
    
    List<String> aliquotasList = new ArrayList<String>();
    
    for (int i = 0 ; i < aliquotas.length() ; i += 4) {
      aliquotasList.add(aliquotas.substring(i, i + 4));
    }

    return aliquotasList;
  }  
}
